import { Module, NestModule, MiddlewareConsumer, RequestMethod } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
import { DogController } from './dog/dog.controller';
import { HttpExceptionFilter } from './filter/http-exception.filter';
import { AllExceptionFilter } from './filter/all.filter';
import { LoggerMidleware } from './middleware/LoggerMidleware';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AdminModule } from './admin/admin.module';
import { MsgModule } from './msg/msg.module';
import { AuthModule } from './auth/auth.module';
import { UserModule } from './user/user.module';

@Module({
  imports: [
    CatsModule,
    TypeOrmModule.forRoot(),
    AdminModule,
    MsgModule,
    AuthModule,
    UserModule,
  ],
  controllers: [AppController, DogController],

  // 注册全局过滤器
  providers: [AppService, {
    provide: APP_FILTER,
    useClass: AllExceptionFilter,
  }, {
    provide: APP_FILTER,
    useClass: HttpExceptionFilter,
  }],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(LoggerMidleware)
      // 可以指定应用中间件的路由和请求方法，可以使用*通配符
      // forRoutes() 可接受一个字符串、多个字符串、对象、一个控制器类甚至多个控制器类。在大多数情况下，您可能只会传递一个由逗号分隔的控制器列表。
      // 我们可以使用该 exclude() 方法轻松排除某些路线。此方法可以采用一个字符串，多个字符串或一个 RouteInfo 对象来标识要排除的路由
      .exclude(
        { path: 'cats', method: RequestMethod.GET },
        { path: 'cats', method: RequestMethod.POST },
        'cats/(.*)',
      )
      // .forRoutes({ path: 'dog', method: RequestMethod.GET})
      .forRoutes(DogController)
  }
}
